bitkeeper revision 1.1282 (4254e8d92URVK0d-Uc-p1l7ymBS-HA)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 7 Apr 2005 08:01:29 +0000 (08:01 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Thu, 7 Apr 2005 08:01:29 +0000 (08:01 +0000)
A few x86/64 cleanups.
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/domain.c
xen/arch/x86/x86_64/mm.c
xen/include/asm-x86/config.h
xen/include/asm-x86/x86_64/asm_defns.h
xen/include/asm-x86/x86_64/page.h
xen/include/xen/shadow.h

index 322181ffdb1cb7b9ae5cd0f1792301d3b6d02526..6508103c283a0de54f5f7c0c434ff906a0ed3271 100644 (file)
@@ -516,7 +516,7 @@ void new_thread(struct exec_domain *d,
 void toggle_guest_mode(struct exec_domain *ed)
 {
     ed->arch.flags ^= TF_kernel_mode;
-    __asm__ __volatile__ ( "mfence; swapgs" ); /* AMD erratum #88 */
+    __asm__ __volatile__ ( "swapgs" );
     update_pagetables(ed);
     write_ptbase(ed);
 }
@@ -600,7 +600,7 @@ static void load_segments(struct exec_domain *p, struct exec_domain *n)
 
     /* If in kernel mode then switch the GS bases around. */
     if ( n->arch.flags & TF_kernel_mode )
-        __asm__ __volatile__ ( "mfence; swapgs" ); /* AMD erratum #88 */
+        __asm__ __volatile__ ( safe_swapgs );
 
     if ( unlikely(!all_segs_okay) )
     {
@@ -651,12 +651,12 @@ static void save_segments(struct exec_domain *p)
 static void clear_segments(void)
 {
     __asm__ __volatile__ (
-        "movl %0,%%ds; "
-        "movl %0,%%es; "
-        "movl %0,%%fs; "
-        "movl %0,%%gs; "
-        "mfence; swapgs; " /* AMD erratum #88 */
-        "movl %0,%%gs"
+        " movl %0,%%ds; "
+        " movl %0,%%es; "
+        " movl %0,%%fs; "
+        " movl %0,%%gs; "
+        ""safe_swapgs"  "
+        " movl %0,%%gs"
         : : "r" (0) );
 }
 
index d56b02fdbab95ef5423e417e41c76bcda01ed958..79d443942afb840d6f8f95c5e0f73416355d8cad 100644 (file)
@@ -23,6 +23,7 @@
 #include <xen/init.h>
 #include <xen/mm.h>
 #include <xen/sched.h>
+#include <asm/asm_defns.h>
 #include <asm/page.h>
 #include <asm/flushtlb.h>
 #include <asm/fixmap.h>
@@ -248,31 +249,33 @@ long do_stack_switch(unsigned long ss, unsigned long esp)
 long do_set_segment_base(unsigned int which, unsigned long base)
 {
     struct exec_domain *ed = current;
-
-    base = canonicalise_virt_address(base);
+    long ret = 0;
 
     switch ( which )
     {
     case SEGBASE_FS:
         ed->arch.user_ctxt.fs_base = base;
-        wrmsr(MSR_FS_BASE, base, base>>32);
+        if ( wrmsr_user(MSR_FS_BASE, base, base>>32) )
+            ret = -EFAULT;
         break;
 
     case SEGBASE_GS_USER:
         ed->arch.user_ctxt.gs_base_user = base;
-        wrmsr(MSR_SHADOW_GS_BASE, base, base>>32);
+        if ( wrmsr_user(MSR_SHADOW_GS_BASE, base, base>>32) )
+            ret = -EFAULT;
         break;
 
     case SEGBASE_GS_KERNEL:
         ed->arch.user_ctxt.gs_base_kernel = base;
-        wrmsr(MSR_GS_BASE, base, base>>32);
+        if ( wrmsr_user(MSR_GS_BASE, base, base>>32) )
+            ret = -EFAULT;
         break;
 
     case SEGBASE_GS_USER_SEL:
         __asm__ __volatile__ (
             "     swapgs              \n"
             "1:   movl %k0,%%gs       \n"
-            "     mfence; swapgs      \n" /* AMD erratum #88 */
+            "    "safe_swapgs"        \n"
             ".section .fixup,\"ax\"   \n"
             "2:   xorl %k0,%k0        \n"
             "     jmp  1b             \n"
@@ -285,10 +288,11 @@ long do_set_segment_base(unsigned int which, unsigned long base)
         break;
 
     default:
-        return -EINVAL;
+        ret = -EINVAL;
+        break;
     }
 
-    return 0;
+    return ret;
 }
 
 
index 84a0492e1d55a977cd7066949ac9b9d19cd9b98b..c7957634885677c7ed89da8458b3bdd32b4aaba9 100644 (file)
@@ -12,6 +12,7 @@
 #endif
 
 #define CONFIG_X86 1
+#define CONFIG_SHADOW 1
 
 #define CONFIG_SMP 1
 #define CONFIG_X86_LOCAL_APIC 1
index 3ac95024cc3bbe0b8bf8cf3f7dd813099c648aa2..d5f0e5b6adf5105c60289a48ca7b0c50cd563a93 100644 (file)
         "popq  %rsi;" \
         "popq  %rdi;"
 
+/* Work around AMD erratum #88 */
+#define safe_swapgs \
+        "mfence; swapgs;"
+
 #else
 
 #define SAVE_ALL \
index d4731b65f446f85ded2ce6db6d6b5e6c62197aa1..029635e3bfedf4ad3982bb614ee136d13ba7a578 100644 (file)
@@ -98,15 +98,6 @@ typedef l4_pgentry_t root_pgentry_t;
 #define L3_DISALLOW_MASK ((cpu_has_nx?0:(1UL<<63)) | (7UL << 7))
 #define L4_DISALLOW_MASK ((cpu_has_nx?0:(1UL<<63)) | (7UL << 7))
 
-#ifndef __ASSEMBLY__
-static inline unsigned long canonicalise_virt_address(unsigned long v)
-{
-    v &= VADDR_MASK;
-    if ( v & (1UL << (VADDR_BITS - 1)) )
-        v |= ~VADDR_MASK;
-}
-#endif /* !__ASSEMBLY__ */
-
 #endif /* __X86_64_PAGE_H__ */
 
 /*
index 8379d4fd450a0be74433af2d849bd239857f7000..a69bd59802da627cadb06f84508bfe188c5089cb 100644 (file)
@@ -4,7 +4,7 @@
 
 #include <xen/config.h>
 
-#ifdef CONFIG_X86
+#ifdef CONFIG_SHADOW
 
 #include <asm/shadow.h>